package com.pi2e.common;

import java.io.File;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.EditText;
import android.widget.Toast;

import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechSynthesizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.SynthesizerListener;
import com.iflytek.speech.setting.TtsSettings;
import com.iflytek.speech.util.ApkInstaller;
import com.iflytek.sunflower.FlowerCollector;
import com.pi2e.R;
import com.pi2e.application.Pi2eApplication;
import com.pi2e.config.ApplicationConfig;
import com.pi2e.config.KdxfConfig;

public class KdxfSpeechHelper {

	// 语音合成对象
	private static SpeechSynthesizer mTts;

	private static Context context;

	private static String TAG = "com.pi2e";
	//默认在线
	private static String speechType = SpeechConstant.TYPE_CLOUD ;
	private static Toast mToast;
	public final static int BEFORE_SPEECH_DELAY_TIME = 200 ;//进入界面语音播放延时时间
	public final static int AFTER_SPEECH_DELAY_TIME = 4000 ;//播放语音完成后界面跳转延时时间

	private static SpeechCompletedListener mSpeechListener ;
	/**  
	* @Title: initSpeechSynthesizer  
	* @Description: TODO(这里用一句话描述这个方法的作用)  
	* @param @param mcontext
	* @param @param speechtype 设置语音合成引擎类型 0：在线；1：本地
	* @param @return    设定文件  
	* @return SpeechSynthesizer    返回类型  
	* @throws  
	*/
	public static SpeechSynthesizer initSpeechSynthesizer(Context mcontext,int speechtype) {
		context = mcontext;
		setSpeechType(speechtype);
		/*
		 * 在使用语音平台上传应用包的时候会自定生成一个appid 应该使用与包相对应的appid在申请提交后没有使用次数的限制
		 */
		// 语音初始化，在使用应用使用时需要初始化一次就好，如果没有这句会出现10111初始化失败
		SpeechUtility.createUtility(context, "appid="+KdxfConfig.APPID);
		if (null == mTts) {
			// 初始化合成对象
			mTts = SpeechSynthesizer.createSynthesizer(context,
					mTtsInitListener);
			setParam();// 设置参数
		}
		//mInstaller = new ApkInstaller(mcontext) ;
		//ApkInstaller.install(mcontext);
		/*String url = SpeechUtility.getUtility().getComponentUrl();
		String assetsApk="SpeechService.apk";
		ApkInstaller.processInstall(mcontext, url,assetsApk);*/
		
		return mTts;

	}
	/**
	 * 初始化监听。
	 */
	private static InitListener mTtsInitListener = new InitListener() {
		@Override
		public void onInit(int code) {
			Log.d(TAG, "InitListener init() code = " + code);
			if (code != ErrorCode.SUCCESS) {
				showTip("初始化失败,错误码：" + code);
			} else {
				// 初始化成功，之后可以调用startSpeaking方法
				// 注：有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成，
				// 正确的做法是将onCreate中的startSpeaking调用移至这里
			}
		}
	};

	private static void showTip(final String str) {
		mToast.setText(str);
		mToast.show();
	}

	/**
	 * 参数设置
	 * 
	 * @param param
	 * @return
	 */
	private static void setParam() {
		// 清空参数
		mTts.setParameter(SpeechConstant.PARAMS, null);
		// 根据合成引擎设置相应参数
		//在线
		if (speechType.equals(SpeechConstant.TYPE_CLOUD)) {
			mTts.setParameter(SpeechConstant.ENGINE_TYPE,
					SpeechConstant.TYPE_CLOUD);
			// 设置在线合成发音人
			mTts.setParameter(SpeechConstant.VOICE_NAME, KdxfConfig.XIAOYAN);
			// 设置合成语速
			mTts.setParameter(SpeechConstant.SPEED,
					KdxfConfig.SPEEK);
			// 设置合成音调
			mTts.setParameter(SpeechConstant.PITCH,
					KdxfConfig.PATCH);
			// 设置合成音量
			mTts.setParameter(SpeechConstant.VOLUME,
					KdxfConfig.VOLUME);
		} else if(speechType.equals(SpeechConstant.TYPE_LOCAL)) {//本地
			mTts.setParameter(SpeechConstant.ENGINE_TYPE,
					SpeechConstant.TYPE_LOCAL);
			// 设置本地合成发音人 voicer为空，默认通过语记界面指定发音人。
			mTts.setParameter(SpeechConstant.VOICE_NAME, "");
			/**
			 * TODO 本地合成不设置语速、音调、音量，默认使用语记设置 开发者如需自定义参数，请参考在线合成参数设置
			 */
		}
		// 设置播放器音频流类型
		mTts.setParameter(SpeechConstant.STREAM_TYPE,"3");
		// 设置播放合成音频打断音乐播放，默认为true
		mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");

		// 设置音频保存路径，保存音频格式支持pcm、wav，设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
		// 注：AUDIO_FORMAT参数语记需要更新版本才能生效
		mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
		mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH,
				ApplicationConfig.CACHE_PATH_KDXF_SPEECH +File.separator+ "tts.wav");
	}
	

	public static void startPlay(String text,SpeechCompletedListener scl) {
		mSpeechListener = scl ;
		// 移动数据分析，收集开始合成事件
		FlowerCollector.onEvent(context, "tts_play");
		
		int code = mTts.startSpeaking(text, mTtsListener);
		// /**
		// * 只保存音频不进行播放接口,调用此接口请注释startSpeaking接口
		// * text:要合成的文本，uri:需要保存的音频全路径，listener:回调接口
		// */
		// String path = Environment.getExternalStorageDirectory()+"/tts.pcm";
		// int code = mTts.synthesizeToUri(text, path, mTtsListener);

		if (code != ErrorCode.SUCCESS) {
			if (code == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED) {
				// 未安装则跳转到提示安装页面
				// mInstaller.install();
			} else {
				showTip("语音合成失败,错误码: " + code);
			}
		}
	}

	/**
	 * 合成回调监听。
	 */
	private static SynthesizerListener mTtsListener = new SynthesizerListener() {

		@Override
		public void onSpeakBegin() {
		//	showTip("开始播放");
			mSpeechListener.onPreperPlay();
		}

		@Override
		public void onSpeakPaused() {
			//showTip("暂停播放");
		}

		@Override
		public void onSpeakResumed() {
			//showTip("继续播放");
		}

		@Override
		public void onBufferProgress(int percent, int beginPos, int endPos,
				String info) {
			// 合成进度
		//	mPercentForBuffering = percent;
			//showTip(String.format(context.getString(R.string.tts_toast_format),
			//		mPercentForBuffering, mPercentForPlaying));
		}

		@Override
		public void onSpeakProgress(int percent, int beginPos, int endPos) {
			// 播放进度
			//mPercentForPlaying = percent;
			//showTip(String.format(context.getString(R.string.tts_toast_format),
			//		mPercentForBuffering, mPercentForPlaying));
		}

		@Override
		public void onCompleted(SpeechError error) {
			if (error == null) {
				//showTip("播放完成");
				mSpeechListener.onCompleted() ;
			} else if (error != null) {
				//showTip(error.getPlainDescription(true));
				mSpeechListener.onError() ;
			}
		}

		@Override
		public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
			// 以下代码用于获取与云端的会话id，当业务出错时将会话id提供给技术支持人员，可用于查询会话日志，定位出错原因
			// 若使用本地能力，会话id为null
			// if (SpeechEvent.EVENT_SESSION_ID == eventType) {
			// String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
			// Log.d(TAG, "session id =" + sid);
			// }
		}
	};

	public static void onResume() {
		// 移动数据统计分析
		FlowerCollector.onResume(context);
		FlowerCollector.onPageStart(TAG);
	}

	public static void onPause() {
		// 移动数据统计分析
		FlowerCollector.onPageEnd(TAG);
		FlowerCollector.onPause(context);
	}

	public static void onDestroy() {
		//mTts.stopSpeaking();
		// 退出时释放连接
		//mTts.destroy();
	}
	
	public static void setSpeechListener(SpeechCompletedListener s){
		mSpeechListener = s ;
	}
	
	public interface SpeechCompletedListener{
		boolean onPreperPlay() ;//开始播放
		boolean onPlay(String Msg) ; //正在播放
		boolean onCompleted() ; //播放完成
		boolean onError() ;
	
	}
	
	/**  
	* @Title: setSpeechType  
	* @Description: TODO(设置语音合成模式 0：在线；1：本地，需要安装科大讯飞的apk)  
	* @param @param type    设定文件  
	* @return void    返回类型  
	* @throws  
	*/
	public static void setSpeechType(int type){
		speechType = KdxfConfig.ENGINE_TYPE[type] ;
		
	}

}
